package yunjiao.javatutorials.guava.concurrent;

import com.google.common.util.concurrent.SettableFuture;

import java.util.concurrent.Executors;

/**
 * 异步处理结果（无需阻塞）
 *
 * SettableFuture 继承 ListenableFuture，可通过 addListener 注册回调，避免 get() 阻塞
 *
 * @author yangyunjiao
 */
public class SettableFutureListenerDemo {
    public static void main(String[] args) throws InterruptedException {
        SettableFuture<String> future = SettableFuture.create();

        // 注册完成监听器：Future 完成后，在指定线程池执行回调
        future.addListener(() -> {
            try {
                // 监听器中获取结果（此时已完成，get() 不会阻塞）
                String result = future.get();
                System.out.println("监听器异步处理结果：" + result);
            } catch (Exception e) {
                System.out.println("监听器捕获异常：" + e.getCause().getMessage());
            }
        }, Executors.newSingleThreadExecutor());

        // 模拟设置结果
        new Thread(() -> {
            try {
                Thread.sleep(1000);
                future.set("异步回调测试");
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        }).start();

        // 主线程无需阻塞，可继续执行其他逻辑
        System.out.println("主线程继续执行...");

        Thread.sleep(2000);
    }
}
